package main

import (
	"fmt"
	"io"
	"os"
)

func f1() {
	var fileObj *os.File
	var err error
	fileObj, err = os.Open("./main.go")
	//defer fileObj.Close() //当err有值得时候，fileObj就是nil,不能调用close()
	if err != nil {
		fmt.Printf("open file failed,err；%v", err)
		return
	}
	defer fileObj.Close()

}

func f2() {
	//1、打开要操作的文件
	fileObj, err := os.OpenFile("./xxx.txt", os.O_RDWR, 0644)
	if err != nil {
		fmt.Printf("open file failed,err；%v", err)
		return
	}

	//2、因为没有办法直接在文件中间插入内容，所以要借助一个临时文件
	tmpFile, err1 := os.OpenFile("./xxxtmp.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
	if err1 != nil {
		fmt.Printf("create file failed,err:%v", err1)
		return
	}

	//3、读取文件

	var ret [1]byte
	n, err2 := fileObj.Read(ret[:])
	if err2 != nil {
		fmt.Printf("read file failed,err2:%v", err2)
		return
	}

	//4.写入临时文件
	fmt.Printf("%c \n", ret[:n])
	tmpFile.Write(ret[:n])

	//5、写入要插入的内容
	fileObj.Seek(1, 0) //光标移动,光标移动到未知
	var s []byte
	s = []byte{'c'}
	tmpFile.Write(s)

	//6、紧接着把源文件后续的内容写入临时文件
	var x [1]byte
	for {
		n, err3 := fileObj.Read(x[:])
		if err3 == io.EOF {
			tmpFile.Write(x[:n])
			fmt.Println("读完了")
			break
		}
		if err3 != nil {
			fmt.Printf("read file failed,err3:%v", err3)
			return
		}
		fmt.Printf("%c \n", x[:n])
		tmpFile.Write(x[:n])
	}
	//源文件后续的也写入到了临时文件中
	fileObj.Close()
	tmpFile.Close()
	os.Rename("./xxxtmp.txt", "./xxx.txt")
}
func main() {
	//f1()
	f2()
}
